/*
 * PropertyConfig.java
 *
 * Created on 9 de noviembre de 2006, 14:14
 *
 */

package es.team.util;

import es.team.exceptions.BadConfigException;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;

/**
 * Clase de configuración de las propiedades del modulo.
 *
 * @version 1.0
 * @author Victor Gimeno
 */
public class PropertyConfig {
    
    /**
     * Usado internamente para mantener las distintas property a configurar
     */
    private static Hashtable registry = new Hashtable(15);
    
    /**
     * Método de configuraci�n de la aplicacion, dado la ruta de un fichero de propiedades
     * @param configFilePath Ruta (de sistema) del archivo con los par�metros de configuraci�n del modulo.
     * @throws BadConfigException si el fichero de configuracion es invalido
     * @throws IOException si hay un problema con la carga del fichero.
     */
    public static final void configure( String configFilePath ) throws IOException, BadConfigException{
        
        Properties props = new Properties();

        FileInputStream istream = new FileInputStream( configFilePath );
        
        props.load(istream);
        
        istream.close();
                
        configure( props );
    }
    
    /**
     * Método de configuraci�n de la aplicacion, dado la ruta de un fichero de propiedades
     * @param configURLPath URL del archivo con los par�metros de configuraci�n del modulo.
     * @throws BadConfigException si el fichero de configuracion es invalido
     * @throws IOException si hay un problema con la carga del fichero.
     */
    public static final void configure( java.net.URL configURLPath ) throws IOException, BadConfigException{
        
        Properties props = new Properties();
        
        props.load( configURLPath.openStream() );
        
        configure( props );
    }
     
    /**
     * Método de configuraci�n de la aplicacion, dado un fichero de propiedades.
     * @param properties Archivo cargados con los par�metros de configuraci�n del modulo.
     * @throws BadConfigException si el fichero de configuracion es invalido
     * @throws IOException si hay un problema con la carga del fichero.
     */
    public static final void configure( Properties properties ) throws IOException, BadConfigException{
        
        Enumeration enumeration = properties.propertyNames();
        
        while(enumeration.hasMoreElements()) {
            
            String key = (String) enumeration.nextElement();
            
            String value = properties.getProperty( key );
            
            synchronized( registry ){
                
                setProperty( key, value );
                
            }
            
        }
                
    }
        
    /**
     * M�todo de acceso a las properties almacenadas
     * @param propertyName Nombre de la propiedad a obtener 
     * @return Valor de la Propiedad almacenada o null si no la ha encontrado.
     * @throws ClassCastException si ha habido un error de conversion de tipos
     */
    public static final String getStringProperty( String propertyName ) throws ClassCastException{
        
        Object retValue = registry.get( propertyName );
        
        if( retValue != null ){
            
            return (String)retValue;
        }
        
        return null;
    }
    
    /**
     * M�todo de acceso a las properties almacenadas
     * @param propertyName Nombre de la propiedad a obtener 
     * @return Valor de la Propiedad almacenada o null si no la ha encontrado.
     * @throws ClassCastException si ha habido un error de conversion de tipos
     */
    public static final String[] getStringArrayProperty( String propertyName ) throws ClassCastException{
        
        Object retValue = registry.get( propertyName );
        
        if( retValue != null ){
            
            String[] values = ((String)retValue).split(",");
            
            for (int i = 0; i < values.length; i++) {
                
                values[i] = values[i].trim();
                
            }
            
            return values;
        }
        
        return null;
    }
    
    /**
     * M�todo de acceso a las properties almacenadas
     * @param propertyName Nombre de la propiedad a obtener 
     * @return Valor de la Propiedad almacenada o null si no la ha encontrado.
     * @throws ClassCastException si ha habido un error de conversion de tipos
     */
    public static final Integer getIntegerProperty( String propertyName ) throws ClassCastException{
        
        Object retValue = registry.get( propertyName );
        
        if( retValue != null ){
            
            return Integer.getInteger((String) retValue );            
        }
        
        return null;
    }
    
    /**
     * M�todo de acceso a las properties almacenadas
     * @param propertyName Nombre de la propiedad a obtener 
     * @return Valor de la Propiedad almacenada o null si no la ha encontrado.
     * @throws ClassCastException si ha habido un error de conversion de tipos
     */
    public static final Boolean getBooleanProperty( String propertyName ) throws ClassCastException{
        
        Object retValue = registry.get( propertyName );
        
        if( retValue != null ){
            
            return new Boolean( "true".equalsIgnoreCase( ((String)retValue).trim().toLowerCase() ) );
            
        }
        
        return null;
    }
    
    /**
     * M�todo de acceso a las properties almacenadas
     * @param propertyName Nombre de la propiedad a obtener 
     * @return Valor de la Propiedad almacenada o null si no la ha encontrado.
     * @throws ClassCastException si ha habido un error de conversion de tipos
     */
    public static final Object getObjectProperty( String propertyName ) throws ClassCastException{
        
        Object retValue = registry.get( propertyName );
         
        return retValue;
    }
    
    /**
     * M�todo sincronizado de acceso a las properties almacenadas
     * @param propertyName Nombre de la propiedad a obtener
     * @param propertyValue 
     */
    public static final void setProperty( String propertyName, Object propertyValue ){
        
        synchronized (registry){
            
            registry.put( propertyName, propertyValue );
            
        }
        
    }
    
}
